package com.palominocia.capa_datos_nodo.servicios;

import java.util.HashMap;

import javax.jws.WebService;
import javax.servlet.http.HttpServletRequest;

import org.apache.cxf.interceptor.InInterceptors;
import org.apache.cxf.interceptor.OutInterceptors;
import org.apache.cxf.message.Message;
import org.apache.cxf.phase.PhaseInterceptorChain;
import org.apache.cxf.transport.http.AbstractHTTPDestination;

import com.palominocia.capa_datos_nodo.controles.ControlNodoPublico;
import com.palominocia.capa_datos_nodo.modelo.opciones.ParametrosRespuesta;
import com.palominocia.capa_datos_nodo.servicios.salida.RespuestaFinal;
import com.palominocia.capa_datos_nodo.servicios.salida.RespuestaProcesarTokenPassword;
import com.palominocia.capa_datos_nodo.servicios.salida.RespuestaRegistraUsuario;
import com.palominocia.capa_datos_nodo.servicios.salida.RespuestaSolicitudReset;
import com.palominocia.capa_datos_nodo.util.Utiles;

@WebService(endpointInterface = "com.palominocia.capa_datos_nodo.servicios.NodoPublico")
@InInterceptors(interceptors = "org.apache.cxf.interceptor.LoggingInInterceptor")
@OutInterceptors(interceptors = "org.apache.cxf.interceptor.LoggingOutInterceptor")
public class NodoPublicoImpl implements NodoPublico{
	private ControlNodoPublico control;
	public NodoPublicoImpl(){
		control =ControlNodoPublico.getInstance();
	}
	protected String getClientIp(){
		String clientIp = "";
		Message message = PhaseInterceptorChain.getCurrentMessage();
		HttpServletRequest request = (HttpServletRequest)message.get(AbstractHTTPDestination.HTTP_REQUEST);
		if ( request != null ) {
	        clientIp = request.getRemoteAddr();
	
	        // Handle proxy
	        String header = request.getHeader( "x-forwarded-for" );
	        if( header != null && !header.isEmpty() ) {
	            clientIp = header.split( "," )[0];
	        }
	    }
		return clientIp;
	}
	@Override
	public RespuestaRegistraUsuario registraUsuario(String Username,
			String Password,String Email) {
		RespuestaRegistraUsuario salida = new RespuestaRegistraUsuario();
		HashMap<String, Object> msgRespuesta = new HashMap<String, Object>();
		String ip=getClientIp();
		try {
			msgRespuesta = control.registraUsuario(Username,Password,Email);
			salida.setCodigoResultado(msgRespuesta.get("codigo").toString());
			salida.setNombreResultado(msgRespuesta.get("mensaje").toString());
		} catch (Exception e) {
			ParametrosRespuesta param =Utiles.CalculaParametro(999999);
			salida.setCodigoResultado(param.getCodigoParametroRespuesta()+"");
			salida.setNombreResultado(param.getNombreParametroRespuesta()+ e.getMessage());
		}
		return salida;
	}
	@Override
	public RespuestaSolicitudReset solicitaresetPassword(String Username,
			String Email) {
		RespuestaSolicitudReset salida = new RespuestaSolicitudReset();
		HashMap<String, Object> msgRespuesta = new HashMap<String, Object>();
		try {
			msgRespuesta = control.solicitaresetPassword(Username,Email);
			salida.setCodigoResultado(msgRespuesta.get("codigo").toString());
			salida.setNombreResultado(msgRespuesta.get("mensaje").toString());
			if(salida.getCodigoResultado().equals(Utiles.CORRECTO)){
				salida.setTokenReferencia(msgRespuesta.get("tokenRef").toString());
			}
		} catch (Exception e) {
			ParametrosRespuesta param =Utiles.CalculaParametro(999999);
			salida.setCodigoResultado(param.getCodigoParametroRespuesta()+"");
			salida.setNombreResultado(param.getNombreParametroRespuesta()+ e.getMessage());
		}
		
		return salida;
	}
	@Override
	public RespuestaFinal validarToken(String Token) {
		RespuestaFinal salida = new RespuestaFinal();
		HashMap<String, Object> msgRespuesta = new HashMap<String, Object>();
		try {
			msgRespuesta = control.validarToken(Token);
			salida.setCodigoResultado(msgRespuesta.get("codigo").toString());
			salida.setNombreResultado(msgRespuesta.get("mensaje").toString());
		} catch (Exception e) {
			ParametrosRespuesta param =Utiles.CalculaParametro(999999);
			salida.setCodigoResultado(param.getCodigoParametroRespuesta()+"");
			salida.setNombreResultado(param.getNombreParametroRespuesta()+ e.getMessage());
		}
		
		return salida;
	}
	@Override
	public RespuestaProcesarTokenPassword procesarTokenPassword(String Token, String Password) {
		RespuestaProcesarTokenPassword salida = new RespuestaProcesarTokenPassword();
		HashMap<String, Object> msgRespuesta = new HashMap<String, Object>();
		try {
			msgRespuesta = control.procesarTokenPassword(Token,Password);
			salida.setCodigoResultado(msgRespuesta.get("codigo").toString());
			salida.setNombreResultado(msgRespuesta.get("mensaje").toString());

		} catch (Exception e) {
			ParametrosRespuesta param =Utiles.CalculaParametro(999999);
			salida.setCodigoResultado(param.getCodigoParametroRespuesta()+"");
			salida.setNombreResultado(param.getNombreParametroRespuesta()+ e.getMessage());
		}
		
		return salida;
	}
}
